#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
#include<dirent.h>
#include<string.h>
#include<time.h>
#include<errno.h>

int ds18b20_get_temperature(float *temp);


int main(int argc,char *argv[])
{
	float temp;
	
	if(ds18b20_get_temperature(&temp)<0)
	{
		printf("ERROR:ds18b20 get temperature failure\n");
		return 1;

	}

	printf("DS18b20 get temperature :%f℃\n",temp);
	return 0;
}



int ds18b20_get_temperature(float *temp)
{
	char	w1_path[50] = "/sys/bus/w1/devices/";
	char	chip[20];
	char	buf[128];
	DIR	*dirp;
	struct dirent	*direntp;
        int 	fd = -1;
	char	*ptr;
	float	value;
	int	found = 0;


	if( !temp )
	{
		
		return -1;
	}	

	if(( dirp = opendir(w1_path)) == NULL)
	{
		printf("Open dir error: %s\n",strerror(errno));
		return -2;
	}

	while((direntp = readdir(dirp)) != NULL)
	{
		if(strstr(direntp->d_name,"28-"))
		{
			strcpy(chip,direntp->d_name);
			found = 1;
		}
	}
	closedir(dirp);

	if( !found )
	{
		printf("Can not find ds18b20 in %S\n",w1_path);
		return -4;
	}

	strncat(w1_path,chip,sizeof(chip)-1);
	strcat(w1_path,"/w1_slave");

	if( (fd=open(w1_path,O_RDONLY))<0 )
	{
		printf("Open %s error: %s\n",w1_path,strerror(errno));
		return -4;
	}

	if( read(fd,buf,sizeof(buf))<0 )
	{
		printf("read %s error: %s\n",w1_path,strerror(errno));
		return -5;
	}

	ptr = strstr(buf,"t=")+2;

	if( !ptr )
	{
		printf("ERROR:Can not get temperature\n");
		return -6;
	}

	*temp = atof(ptr)/1000;
	return 0;

}
